\documentclass[12pt]{article}

\usepackage[english]{babel}
\usepackage[utf8]{inputenc}
\usepackage{amsthm}
\usepackage{theoremref}
\usepackage{amsmath}
\usepackage{graphicx}
\usepackage{subcaption}
\usepackage{caption}

\title{Modelos de Linguagem de Programação		
		\\ Relatório Trabalho Final        
        \\ Prof. Lucas de Mello Schnorr}
\author{Alunos: Felipe Mathias Schmidt, Mario Gasparoni}

\begin{document}
\maketitle

\section{Introdução}
%\begin{introduction}
Para este trabalho, escolhemos o problema relacionado à criação de um jogo estilo 'Tower Defense', onde o objetivo do jogador é posicionar torres que lançam objetos em intervalos de tempo regulares em direção aos inimigos; tais torres são posicionadas em um cenário onde os inimigos possuem uma rota já traçada e conhecida pelo jogador. Na implementação deste trabalho utilizamos a linguagem de programação Python, com a adição de um facilitador de implementação de jogos que é a biblioteca Pygame.
%\end{introduction}

\section{O Jogo}
Como de conhecimento de todos universitários da UFRGS, a refeição diária em nosso Restaurante Universitário (RU) consiste praticamente em uma batalha; resolvemos usar este cenário de forma bem humorada como contexto ao nosso jogo. Definimos o jogador como sendo algum funcionário do RU, o qual tenta impedir os estudantes (inimigos) de levar suas bandeijas até o barril onde os restos de comida devem ser depositados. Adicionamos também um elemento novo à este tipo de jogo, que consiste em um 'shooter', o qual agrega caracteristíca dos clássicos jogos estilo 'space invaders' que é a de existir um objeto que é controlado pelo usuário e que realiza disparos no inimigo. Sendo assim, o usuário do nosso jogo defende o barril não apenas posicionando objetos/atiradores no campo de batalha, mas também controlando um elemento 'shooter' móvel.

\subsection{Como Jogar}
Para jogar, existem dois elementos que podem ser controlados pelo jogador: a torre e o shooter. Para movimentar o shooter, o jogador pode ir para esquerda e direita usando as setas ou as teclas 'a' e 'd', respectivamente; para atirar munição padrão é usada a tecla 'espaço', já para a ultramunição é usada a tecla 'x'. A movimentação das torres é dada pelo mouse; para trocar a orientação dela entre norte e sul pode-se usar a seta para baixo ou a tecla 's'; para o posicionamento dela basta um clique com o botão esquerdo do mouse, ressaltando que as torres atiram automaticamente de tempos em tempos, dependendo do nível do jogador.

\section{Aspectos de Plataforma}
Nesta seção será discorrido a respeito da tecnologia/linguagem utilizada e suas características.

\subsection{Python e Pygame}
Com relação a linguagem Python, a wikipedia[4] nos dá as seguintes características: linguagem fortemente tipagem, de tipagem dinâmica, sendo ela imperativa e interpretada. Também oferece suporte a expressões lambda e orientação a objeto; pela experiência enfrentada, percebemos os seguints benefícios e problemas: \\

Benefícios:
\begin{itemize}
\item \textbf{Identação} - Permite um código mais enxuto e limpo, por não usar chaves ('\{\}') para a delimitação dos escopos, mantendo uma boa legibilidade e ganhando mais em redigibilidade;
\item \textbf{Interpretada} - Devido a esta característica, o interpretador mostrar ao programador erros mais significativos em tempo de execução. Além disso é possível realizar testes diretamente em uma instância aberta do interpretador.
\item \textbf{Flexível} - Python é bastante flexível, tanto para criação de scripts simples, como na criação de programas complexos que utilizam técnicas como orientação a objetos.
\item \textbf{Documentação} - Por possuir uma comunidade bastante forte, há bastante material útil para ajudar a resolver os problemas que aparecem durante o aprendizado da linguagem.
\item \textbf{Bibliotecas} - Existe uma enorme diversidade de bibliotecas, com os mais diferentes propósitos, permitindo reusabilidade, que por sua vez torna o desenvolvimento mais ágil e rápido. No nosso caso, foi utilizada a biblioteca pygame.
\end{itemize} 

Problemas:
\begin{itemize}
\item \textbf{Fortemente Tipada} - Auxilia a manutenção da corretude do programa por parte do desenvolvedor, evitando diversos tipos de construções inválidas. Representa um ganho em confiabilidade.
\end{itemize} 

Com relação a biblioteca Pygame:

Benefícios:
\begin{itemize}
\item \textbf{Facilidade de utilização} - Ao contrário de outras bibliotecas gráficas como OpenGL (para C) ela é bastante fácil e intuitiva de se entender e utilizar.
\item \textbf{Rapidez de Codificação / Redigibilidade} - Existem diversas funções prontas, que realizam o trabalho 'difícil' ao programador que deseja manter um foco maior no desenvolvimento das estruturas de dados do jogo(figuras geométricas, animações,etc) , e não no desenvolvimento de rotinas de baixo nível para renderização de gráficos pixel a pixel. Isso garante uma maior redigibilidade ao programador de jogos, que passa a ter mais foco nas estruturas de dados correspondentes ao jogo propriamente dito.
\end{itemize}

Problemas:
\begin{itemize}
\item \textbf{Performance} - para a criação de jogos mais completos o desempenho é afetado, principalmente por Python ser uma linguagem interpretada.
\end{itemize}

\section{Aspectos de Implementação}
Nesta seção serão abordados aspectos referentes às questões técnicas de implementação, bem como evidenciar aspectos relevantes e solicitados para a elaboração do jogo.

\subsection{Objetos do Jogo}
Pelo fato de Python oferecer orientação a objetos, durante o desenvolvimento do jogo, foram definidos objetos para representar os elementos gráficos a serem renderizados, são eles:
\begin{itemize}
\item Munição (classe ammo.py, com filhos spoon.py e ultraspoon.py)
\item Jogador (classe player.py)
\item Inimigos (classe enemies.py)
\item Plano de Fundo (classe backgraound.py)
\item Atirador (classe shooter.py)
\item Informações do Jogador (classe score.py)
\item Torre (classe tower.py)
\end{itemize}

Tais objetos foram divididos em módulos (diferentes arquivos-fonte, contendo , cada um, a definição de uma classe) que implementam funções pertinentes ao objeto e definem seus atributos. Apesar de Python permitir que se programe todo o jogo em um único arquivo/módulo, essa escolha não feita,  visando justamente aumentar ao máximo a modularidade do nosso código.

\subsection{Métodos e Atributos de Objetos}
Tomando como exemplo o módulo tower.py que define uma torre, temos a função 'track' que é chamada a cada nova iteração do jogo para reposicionar a torre na tela, desenhando-a no local apontado pelo mouse. A função \_\_init\_\_ também foi definida para que, ao posicionar uma torre, esta nova instância podesse ser inicializada com os atributos posição e orientação definidas pelo local do clique; esta função é a sobreescrita do construtor padrão do objeto. Alguns atributos pertinentes apenas a esta classe também são definidos aqui, como por exemplo 'x\_pos', 'y\_pos', que definem a posição do objeto na tela e 'orientation' que define a orientação, bem como as sprites definidas para a torre. Como exemplo de atributos e funções, temos o seguinte trecho de código extraído da classe tower.py:


\emph{class Tower:}

\emph{	x\_pos = 0}
    
\emph{    y\_pos = 0}
    
\emph{    def (self, screen): }
    
    
Vale ressaltar que nos métodos de classe o primeiro parâmetro \emph{self} deve ser sempre adicionado.

\subsection{Herança}
Temos o o módulo 'ammo.py', descrevendo a classe 'ammo' , que define as características básicas da munição utilizada no jogo. Como classe filha temos a classe 'spoon' no módulo 'spoon.py' que herda os atributos de ammo (como x\_pos e y\_pos) adicionando a isso uma sprite que define a munição colher. Herdando a classe spoon, temos outra classe filha chamada 'spoonultra' presente no módulo 'spoonultra.py', a qual herda tudo de seus ancestrais; no nosso caso esta classe apenas sobreescreve o sprite de spoon, mas poderiam ser adicionadas mais características ou especializando as já existentes na classe pai.

Um ponto interessante e importante no desenvolvimento desta construção é que a função 'update' da classe ammo pode ser usada em qualquer uma das classes filhas; esta função tem por objetivo desenhar na tela o objeto, sendo flexível para qualquer um dos tipos de munição descritos.

\subsection{Polimorfismo}
\subsubsection{Paramétrico}
Na linguagem Python, com o auxílio do mecanismo de tipagem dinâmica, o polimorfismo paramétrico (análogo ao 'generics' em JAVA) pode ser implementado naturalmente durante as definições dos métodos, ou seja, define-se os métodos sem a necessidade de dar atenção ao tipo de cada parâmetro. Basta que o parâmetro seja manipulado de acordo com a sua definição (por exemplo, caso seja o parametro represente um objeto lista,e que possua os métodos insert(),first(),rest(), basta utilizarmos as chamadas desses métodos corretamente para esse parametro, independentemente se o objeto represente uma lista de inteiros ou uma lista de strings). Foi utilizada uma forma de polimorfismo paramétrico no arquivo 'rudefense.py' , onde a definição das listas de tiros disparados e inimigos presentes foram realizadas e logo em seguidas utilizadas (como por exemplo com o metodo append())da mesma maneira, mesmo que representem tipos de dados diferentes.
Como vantagem, obtivemos um ganho significativo em redigibilidade e também legibilidade.
\subsubsection{Por sobrecarga}
Em algumas situações, foi necessária a utilização de métodos semelhantes, porém com diferentes formatos de entrada de dados. No nosso código, esse fenômeno ocorreu em alguns contrutores (como por exemplo em ammo.py), que , dependendo da situação necessitavam de diferentes modos de inicialização para a classe em questão.
A principal vantagem desse tipo de polimorfismo foi poder possuir em mãos os dois tipos de inicialização da classe, referenciados pelo mesmo nome, o que , de certa forma rendeu um ganho em redigibilidade de código durante a escrita dos diferentes tipos de chamada.
\subsection{Especificação e uso de funções}
\subsubsection{Como elementos de primeira ordem}
Diferentemente de algumas outras bibliotecas gráficas (como, por exemplo, a  OpenGL), não foi necessário utilizar funções de primeira ordem, ou callbacks
para a execução de código que represente algum tipo de processamento. O controle do loop principal do nosso jogo é realizado por nós através de um comando while() apenas, seguido de algumas definições padrões para a correta renderização em tela.

\subsubsection{Funções de ordem maior}
Apesar de Python já possuir a função 'map', que recebe uma função e uma lista de elementos a serem aplicados nessa função, retornando uma lista com os resultados, essa não foi utilizada em nossa implementação, também por motivos semelhantes aos citados no item anterior, que basicamente consistem em não necessidade de execuções de nossas funções/métodos por parte de outros, ou na não necessidade de interá-las para diferentes valore.

\subsubsection{Funções lambda e/ou currying}
Apesar de Python dar suporte tanto ao cálculo lambda, como currying, nossa implementação não fez uso de funções desse tipo, uma vez que boa parte dos elementos necessários seguem o modelo de encapsulamento de orientação a objetos.


\subsubsection{Funções de Pattern Matching}
Característico de linguagens como Scala, o pattern matching aqui não foi utilizado, uma vez que os padrões existentes no nosso programa
correspondem a elementos geométricos bem definidos e existentes na lista de torres e de munições presentes na tela em um determinado momento, não necessitando realizar algum tipo de busca e comparação sobre objetos desses tipos utilizados.


\subsection{Construções de Python}
Para o armazenamento dos objetos correspondes aos personagens e munições / armas existentes no jogo, foram utilizadas listas. Este tipo de construção se mostrou bastante útil e de fácil uso, em especial pois tornou possível adicionar elementos de tipos distintos nesta lista e, ao iterar sobre ela, permitiu o uso uma função que operasse com qualquer um destes tipos. Exemplificando, temos na classe 'rudefense.py' uma lista de torres com suas coordenadas e orientações, usamos esta lista para atualizar (no caso, fazer com que atirem) todas as torres posicionadas no cenário.

\subsection{Organização do Código}
O script/módulo principal se chama 'rudefense.py',  e é responsável por inicializar as estruturas de dados e classes a serem utilizadas, bem como  coordenar o laço principal do jogo. Este módulo faz referência basicamente a todos os outros, compondo todos os elementos para a criação do jogo. Os módulos restantes são utilizados  para representar algum elemento do jogo ou para conter atributos comuns a todos, como é o caso da 'commons.py'

\subsection{Versionamento}
Como ferramenta para controle e rastreamento de versão foi utilizado o GIT (http://git-scm.com/) hospedando os arquivos no repositório da GOOGLE em https://code.google.com/p/rudefense/ , o qual se encontra online e disponível para clonagem.
\section{Análise Crítica}
Alguns critérios/parâmetros percebídos na linguagem, seguidos de um breve comentário.

\begin{itemize}
\item \textbf{Legibilide} - Boa. Identação ajuda, mas sinda ente-se a falta de um tipo explícito para as variáveis, o que dificulta as vezes em saber o que está acontecendo em algumas declarações.
\item \textbf{Redigibilidade} - Muito boa. Identação também sendo um dos responsáveis pela boa redigibilidade.
\item \textbf{Segurança} - Muito boa, também pelo fato de não se poder manusear dados na memória explicitamente.
\item \textbf{Orientação a Objeto} - Muito boa, oferencendo características fundamentais como, por exemplo,  hierarquia de classes e sobreescrita de métodos.
\end{itemize}



\section{Conclusão}
Por ser a primeira experiência com uma linguagem interpretada e que usa a identação para a definição de escopos, foi possível observar que as linguagens as quais estamos acostumados a usar podem não ser a melhor solução para todas as tarefas já realizadas anteriormente (como trabalhos de faculdade por exemplo). Python se mostrou uma linguagem bastante legível e, principalmente, bastante redigível, sendo também de fácil aprendizado para aqueles que já tem uma base de programação.


Foi interessante também observar que esta linguagem apresenta propostas diferentes para a solução do mesmo problema, como a declaração de uma lista por exemplo, que é muito menos "burocrática" em Python do que em Java, muito menos ainda que em C.


Concluindo, de fato a disciplina foi importante por ter forçado o uso de linguagens novas, como Objective-C, Python e Latex, mostrando que muitas vezes a simples escolha da linguagem correta para a solução de um determinado problema pode fazer dele algo muito mais tangível de resolução. Exemplificando, este mesmo trabalho se feito em C usando OpenGL, possívelmentee teria demandado muito mais que apenas algumas semanas, isto sem considerar o tempo de aprendizado de toda a biblioteca e da linguagem.


Dentre as maiores dificuldades encontradas podemos citar, ao começo da utilização da linguagem, entender a sua ideia se ambientar com a forma de programar. As primeiras construções de lista e criação/instanciação de objetos foram um tanto estranhas, em especial pelo fato da linguagem não ter tipagem explícita, mas ainda assim foi uma  questão de pouco tempo até isso deixar de ser uma incomodação. Outra dificuldade foi com relação à biblioteca Pygame, que na verdade seria mais um problema de lógica de construção de jogo, pois algumas vezes dependendo da ordem de chamada das funções o jogo exibia comportamento inesperado, mas assim como anteriormente citado, foi questão de pegar a ideia principal que o resto foi um tanto quanto tranquilo.

\section{Referências}

\begin{itemize}
\item [1]Python


http://www.learnpython.org/ , último acesso em 10/06/2013


http://www.python.org.br/ , último acesso em 10/06/2013

\item [2]Pygame


http://www.pygame.org/ , último acesso em 15/06/2013

\item [3] \LaTeX{}


https://www.writelatex.com/ , último acesso em 16/06/2013

\item [4]wikipedia

http://en.wikipedia.org/wiki/Python , último acesso em 17/06/2013

\end{itemize}


\end{document}
